/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fachada;

import java.util.ArrayList;
import java.util.Date;
import java.util.ListIterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import pap.pickapartner.Carona;
import sun.misc.Compare;
import sun.misc.Sort;


public class MonitorCaronas implements Runnable{

    
    //Ele é uma Thread que fica, em loop, olhando o banco de 10 em 10 minutos.
    //Implementar interface Runnable. Parecido com o Listener de uma porta.
    //Assim que chegar o momento de execução de uma Carona, ele chama execucaoCarona.
    
    private ArrayList<Carona> caronasBanco;

    
    public MonitorCaronas(ArrayList<Carona> caronasBanco) {
        this.caronasBanco = caronasBanco;
    }

    public MonitorCaronas() {
        this.caronasBanco = obterCaronasBanco();
    }

    public ArrayList<Carona> getCaronasBanco() {
        return caronasBanco;
    }

    public void setCaronasBanco(ArrayList<Carona> caronasBanco) {
        this.caronasBanco = caronasBanco;
    }
    
    
    public void execucaoCarona(Carona carona){
        if(carona.executar()){
            //atualiza o banco de dados com "carona".
        }else{
            //remove do banco de dados essa "carona".
        }
    }

    @Override
    public void run() {
        while(true){
            this.setCaronasBanco(obterCaronasBanco());
            try {
                Date atual = new Date();
                ListIterator<Carona> listaCaronas = (ListIterator<Carona>) caronasBanco.iterator();
                while(listaCaronas.hasNext()){
                    Carona caronaNext = listaCaronas.next();
                    Date next = caronaNext.getHorario().getData();
                    if(atual.compareTo(next)<=0){
                        this.execucaoCarona(caronaNext);
                    }
                }                
                Thread.sleep(1000 * 600);
            } catch (InterruptedException ex) {
                Logger.getLogger(MonitorCaronas.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private ArrayList<Carona> obterCaronasBanco() {
        //Metodo para se conectar com banco de dados e obter as caronas,
        //ja ordenadas, da tabela do banco de dados.
        
        ArrayList<Carona> caronas = new ArrayList<Carona>();
        Object[] lista = caronas.toArray();
        Sort.quicksort(lista, new Compare() {

            public int doCompare(Object arg0, Object arg1) {
                return ((Comparable)arg0).compareTo(arg1);
            }
        } );
        caronas = new ArrayList<Carona>(lista.length);
        for(int i = 0; i < lista.length; i++) {
            caronas.add((Carona)lista[i]);
        }
        
        return caronas;
    }
    
}
